/**
 * 
 */
package com.study.thread;

/**
 * @author Administrator
 * @date 2019年4月28日
 */
public class RunableThreadDemo {

	//范例2：实现Runable接口可以资源共享
	//虽然启动了3个线程， 但是三个线程一共才卖出去5张票，即ticket属性是被所有线程所共享的。
	public static void main(String[] args) {
		RunnableThread runnableThread = new RunnableThread();
		Thread t1 = new Thread(runnableThread,"t1");
		Thread t2 = new Thread(runnableThread,"t2");
		Thread t3 = new Thread(runnableThread,"t3");
		
		t1.start();
		t2.start();
		t3.start();
	}
	
}

class RunnableThread implements Runnable{
	private int ticket = 5;
	
	@Override
	public void run(){
		
		//synchronized (this)
		synchronized (this)  //同步代码块
		{			
			//线程1在执行 ticket--之前，线程2 进入了 if (ticket > 0) 这个判断，这样当线程1 ticket--之后ticket==0了，线程2再次执行ticket--那么ticket==-1。相当于多执行了一次 ticket--
			while(ticket > 0 ){
				try {
					Thread.sleep(300);
					
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "卖了一张票，当前票数： " + --ticket);
			}
		}
	}
}

/*
 * 如果run 方法不加上线程同步synchronized , 那程序会出现如下结果:（其中一种） 
t2卖了一张票，当前票数： 3
t1卖了一张票，当前票数： 2
t3卖了一张票，当前票数： 4
t1卖了一张票，当前票数： 1
t2卖了一张票，当前票数： 0
t3卖了一张票，当前票数： -1
t1卖了一张票，当前票数： -2
t2在卖最后一张票的时候， t1,t3也进入 if (ticket > 0) 这个判断，这样当t2执行完后ticket 则为0, t1和t3则为负数了

加上synchronized (this)后，ticket 就不会有负数出现
*/
